package com.example.chapter4.aspect;

import com.example.chapter4.aspect.validator.UserValidator;
import com.example.chapter4.aspect.validator.impl.UserValidatorImpl;
import com.example.chapter4.pojo.User;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;

@Aspect
public class MyAspect {

    //这里我们看到了 一个注解＠DeclareP缸ents ， 它的作用是引入新的类来增强服务 ， 它有两个必须
    //配置的属性 value 和 defaultlmpl 。
    //• value：指向你要增强功能的目标对象 ， 这里是要增强 UserServicelmpl 对象 ， 因此可以看到
    //配置为 com .springboot.chapter4.aspect. se凹ice.impl.UserServicelmpl＋。
    //• defaultlmpl ： 引入增强功能 的类 ， 这里配置为 UserValidatorlmpl ，用来提供校验用户是否为
    //空的功能 。
    @DeclareParents(value = "com.example.chapter4.aspect.service.impl.UserServiceImpl+",defaultImpl = UserValidatorImpl.class)
    public UserValidator userValidator;

    @Pointcut("execution(* com.example.chapter4.*.*.*.*.print(..))")
    public void pointCut() {
    }

    @Before("pointCut() && args(user)")
    public void beforeParam( User user) {
        System.out.println("before ......");
    }

    @Before("pointCut()")
    public void before() {
        System.out.println("before ......");
    }

    @After("pointCut()")
    public void after() {
        System.out.println("after ......");
    }


    @AfterReturning("pointCut()")
    public void afterReturning() {
        System.out.println("afterReturning ......");
    }

    @AfterThrowing("pointCut()")
    public void afterThrowing() {
        System.out.println("afterThrowing ......");
    }


    @Around("pointCut()")
    public void around(ProceedingJoinPoint jp) throws Throwable {
        System.out.println("around before......");
        jp.proceed();
        System.out.println("around after......");
    }
}
